package cn.walls1717.juc.future;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * thenApply thenRun thenAccept方法测试
 *
 * @author walls1717
 * @create 2022/12/09 15:44
 **/
@Slf4j
public class CompletableFutureApi3Demo {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3);

        /*
         * thenRun没有返回结果，也不获取上一步的结果，就是等待上一步执行完成之后再执行。
         * 线程都是同一个，没有启新线程。
         */
        log.info(String.valueOf(CompletableFuture.supplyAsync(() -> {
            log.info(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "hello";
        }, executor).thenRun(() -> {
            log.info(Thread.currentThread().getName());
        }).join()));

        /*
         * thenApply有返回结果，等待上一步的结果，获得并对其进行处理再返回。
         * 线程都是同一个，没有启新线程。
         */
        /*log.info(String.valueOf(CompletableFuture.supplyAsync(() -> {
            log.info(Thread.currentThread().getName());
            return "hello";
        }, executor).thenApply((v) -> {
            log.info(Thread.currentThread().getName());
            return v + " thenApply";
        }).join()));*/

        /*
         * thenAccept没有返回结果，等待上一步执行完成获得上一步的执行结果处理。
         * 线程都是同一个，没有启新线程。
         */
        /*log.info(String.valueOf(CompletableFuture.supplyAsync(() -> {
            log.info(Thread.currentThread().getName());
            return "hello";
        }, executor).thenAccept((v) -> {
            log.info(Thread.currentThread().getName() + " " + v);
        }).join()));*/

        executor.shutdown();

    }
}
